import 'dart:convert';

import 'package:lib_uikit/native/common_ui_api.dart';

class GTVideoInfo {
  /// 视频路径
  String videoPath;

  /// 视频缩略图路径
  String thumbPath;

  GTVideoInfo(this.videoPath, this.thumbPath);
}

class GTNativeUiServer {
  static final GTNativeUiServer _instance = GTNativeUiServer._();

  static GTNativeUiServer get instance => _instance;

  final GTCommonUiApi hostApi = GTCommonUiApi();

  GTNativeUiServer._();

  /// 拍照
  /// @param allowsEditing 是否允许编辑
  /// @return 为 null 时，表示用户取消了选择
  /// @return 为 String 时，表示用户选择的图片路径
  Future<String?> pickImageFromCamera({bool allowsEditing = false}) {
    return GTNativeUiServer.instance.hostApi.pickImageFromCamera(allowsEditing);
  }

  /// 从相册选择图片
  /// @param maxCount 最大选择数量
  /// @param fileNamePrefix 为 null 时，表示使用默认的文件名前缀
  /// @return 用户选择的图片路径列表
  Future<List<String>> pickImageFromGallery({int maxCount = 1, String? fileNamePrefix}) async {
    final result = await GTNativeUiServer.instance.hostApi.pickImageFromGallery(maxCount, fileNamePrefix);
    if (result == null || result.isEmpty) {
      return [];
    }
    final paths = jsonDecode(result).cast<String>().toList();
    return paths;
  }

  /// 从相册选择视频
  /// @param allowsEditing 是否允许编辑
  /// @return 为 null 时，表示用户取消了选择
  /// @return 为 GTVideoInfo 时，表示用户选择的视频信息
  Future<GTVideoInfo?> pickVideoFromGallery({bool allowsEditing = false}) async {
    final result = await GTNativeUiServer.instance.hostApi.pickVideoFromGallery(allowsEditing);
    if (result == null || result.isEmpty) {
      return null;
    }
    final data = jsonDecode(result);
    final videoInfo = GTVideoInfo(data['videoPath'], data['thumbPath']);
    return videoInfo;
  }

  /// 清除临时图片
  void cleanPickedImageCache() {
    GTNativeUiServer.instance.hostApi.cleanPickedImageCache();
  }

  /// 打开图片浏览页
  /// @param photoUrls 图片地址列表
  /// @param index 初始显示的图片索引
  openPhotoBrowser(List<String> imageUrls, int index) {
    GTNativeUiServer.instance.hostApi.openPhotoBrowser(imageUrls, index);
  }

  /// 日期时间选择器
  /// @param mode 日期时间选择器模式
  /// @param pickerTitle 标题
  /// @param confirmButtonTitle 确认按钮标题
  /// @param minimumDate 为 null 时，表示不限制最小日期
  /// @param maximumDate 为 null 时，表示不限制最大日期
  /// @param initialDate 为 null 时，表示初始日期为当前日期
  /// @return 为 null 时，表示用户取消了选择
  /// @return 为 int 时，表示用户选择的日期, unix 时间戳, 单位秒
  Future<int?> pickDate({
    required GTDatePickerMode mode,
    String? pickerTitle,
    String? confirmButtonTitle,
    int? minimumDate,
    int? maximumDate,
    int? initialDate,
  }) async {
    return GTNativeUiServer.instance.hostApi.pickDate(mode, pickerTitle, confirmButtonTitle, minimumDate, maximumDate, initialDate);
  }
}
